1 module hip.loaders.fonts;
2 import hip.filesystem.hipfs;
3 import hip.asset_manager.load_task;
4 import hip.assetmanager;
5 import hip.api.data.commons;
6 import hip.font.bmfont;
7 import hip.font.ttf;
8 import hip.assets.texture;
9 
10 
11 
12 final class HipTTFFontLoadTask : HipAssetLoadTask
13 {
14     private HipFSPromise fs;
15     int fontSize;
16     HipFont font;
17     private ubyte[] rawImage;
18 
19     this(string path, string name, HipAsset asset, int fontSize, const(ubyte)[] extraData ,string fileRequesting, size_t lineRequesting)
20     {
21         super(path, name, asset, extraData, fileRequesting, lineRequesting);
22         this.fontSize = fontSize;
23     }
24 
25     override void update()
26     {
27         final switch(result) with (HipAssetResult)
28         {
29             case waiting:
30                 result = loading;
31                 worker = HipAssetManager.loadWorker("Load and Decode TTF Font", ()
32                 {
33                     HipFS.read(path)
34                     .addOnError((string err){error = err; result = cantLoad;})
35                     .addOnSuccess((in ubyte[] data)
36                     {
37                         Hip_TTF_Font ttFont = new Hip_TTF_Font(path, fontSize);
38                         font = ttFont;
39                         if(!ttFont.partialLoad(data, rawImage))
40                         {
41                             result = cantLoad; error = "Could not load TTF data";
42                             return FileReadResult.free;
43                         }
44                         result = mainThreadLoading;
45                         return FileReadResult.free;
46                     });
47                 });
48                 break;
49             case loading:
50                 break;
51             case mainThreadLoading:
52                 Hip_TTF_Font ttFont = cast(Hip_TTF_Font)font;
53                 if(!ttFont.loadTexture(rawImage))
54                 {
55                     result = cantLoad; error = "Failed loading texture for TTF Font";
56                     return;
57                 }
58                 asset = ttFont;
59                 result = loaded;
60                 break;
61             case cantLoad: goto case loaded;
62             case loaded:
63                 break;
64         }
65     }
66 
67 }
68 
69 
70 final class HipBMFontLoadTask : HipAssetLoadTask
71 {
72     private HipFSPromise fs;
73     int fontSize;
74     HipBitmapFont font;
75     IImage loadedImage;
76 
77     this(string path, string name, HipAsset asset, int fontSize, const(ubyte)[] extraData, string fileRequesting, size_t lineRequesting)
78     {
79         super(path, name, asset, extraData, fileRequesting, lineRequesting);
80         this.fontSize = fontSize;
81     }
82 
83     override void update()
84     {
85         final switch(result) with (HipAssetResult)
86         {
87             case waiting:
88                 result = loading;
89                 worker = HipAssetManager.loadWorker("Load and Decode BMFont", ()
90                 {
91                     HipFS.read(path)
92                     .addOnError((string err){error = err; result = cantLoad;})
93                     .addOnSuccess((in ubyte[] data)
94                     {
95                         font = new HipBitmapFont();
96                         if(!font.loadAtlas(cast(string)data, path))
97                         {
98                             result = cantLoad; error = "Could not load BMFont data";
99                             return FileReadResult.free;
100                         }
101                         HipFS.read(font.getTexturePath)
102                         .addOnError((string err){ result = cantLoad; error = err; })
103                         .addOnSuccess((in ubyte[] imgData)
104                         {
105                             new Image(font.getTexturePath(), imgData, (IImage img)
106                             {
107                                 result = mainThreadLoading;
108                                 loadedImage = img;
109                             }, (){result = cantLoad; error = "Failed to load image data"; });
110                             return FileReadResult.free;
111                         });
112                         return FileReadResult.free;
113                     });
114                 });
115                 break;
116             case loading:
117                 break;
118             case mainThreadLoading:
119 
120                 if(!font.loadTexture(new HipTexture(loadedImage, HipResourceUsage.Immutable)))
121                 {
122                     result = cantLoad; error = "Failed loading texture for TTF Font";
123                     return;
124                 }
125                 asset = font;
126                 result = loaded;
127                 break;
128             case cantLoad: goto case loaded;
129             case loaded:
130                 break;
131         }
132     }
133 
134 }